<?php
defined('_XR_EXEC') or die();
/**
* 工厂构建类
* by zhoupeng 2011-7-8
*
*
*
*/
class factory{
	# 实例化自己
	public static function singleton()
	{
		static $instances;
		if (!isset ($instances))
		{
			$instances = new factory();
		}
		return $instances;
	} 
	public static function getDBO($templet=''){
		static $instance = array();
		if($templet === ''){
			$templet = self::getcfg('db_default','default','db');
		}	
		if (!isset($instance[$templet])) {
			$conf = self::getcfg('db_templet',array(),'db');
			//初始化数据库配置信息
			$options = $conf[$templet];
			//获取数据库类型
			$db_type = 'database_'.$options['type'];
			//使用options构建出数据库操作对象给  $instance[$templet]
			$instance[$templet] = new $db_type($options);
		}
		return $instance[$templet];
	}
	/**
	 * 加载配置文件
	 *
	 * @return object
	 */
	public static function getcfg($key=null,$default=null,$templet='default'){
		static $instance = array();
		if($templet == '') $templet = 'default';
		if(!isset($instance[$templet])){
			$templet_class = $templet.'_config';
			self::load($templet_class,XR_APP_CONFIG);
			$instance[$templet] =  new $templet_class ();
		}
		if($key===null){
			return $instance[$templet];
		}	
		if(isset($instance[$templet]->$key)){
			return $instance[$templet]->$key;
		}else{
			return $default;
		}	 
	}
  
	
	
  /* 加载模板编译器 */
	public static function & loadetpl() {
		static $parser;
		if (!isset ($parser)) {
			if (factory::load("lib#etpl#etplparser")) {
				$parser = new eTplParser();
			} else {
				trigger_error('加载模板编译器出错!!!', E_USER_ERROR);
			}
		}
		return $parser;
	}	
	/**
	 * 加载class目录中的类
	 *
	 * @return object
	 */
	public static function loadClass($className='',$static=true){
		if($className == '') return false;
		$className = strtolower($className);
		$adapter = $className; 
		static $instance = array();
		if($static==true){
			if (!isset($instance[$className])) {
				if(self::load($adapter,XR_ENGINE_CLASS) === false){
					Errors::Go('Not found class '.$className);
				}
				$instance[$className] = new $adapter ();
			}
			return $instance[$className];
		}else{
			self::load($adapter,XR_ENGINE_CLASS);
			return new $adapter ();
		}
	}
	/**
	 * 加载module类
	 *
	 * @return object
	 */
	public static function module($modulesName=''){
		if($modulesName == '') return false;
		static $instance = array();
		$modulesName = strtolower($modulesName);
		if (!isset($instance[$modulesName])) {
			$adapter = $modulesName.'_model'; 
			self::load($adapter,XR_APP_MODEL);
			$instance[$modulesName] = new $adapter ();
		}
		return $instance[$modulesName];
	}
	
	# 加载php文件，以#表示文件夹
	public static function load($class,$base=XR_ENGINE){
		static $files=array();
		if(!isset($files[$class]) || !($files[$class]==true))
		{
			$file = $base . str_replace('#', DS, $class) . '.php';
			
			if (file_exists($file)){
				$inc=include($file);
				if($inc){
					$files[$class]=true;
					return $inc;
				}else{
					return false;
				}
			}else{
				return false;
			}
		}else{
			return true;
		}
	}
}
?>
